package com.hspedu.smallchange;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * @Author Stringzhua
 * @Date 2024/3/3 15:28
 * description:
 * 该类完成零钱通的各个功能
 * <p>
 * 使用OOP完成(面向对象功能)
 * 把各个功能对应一个方法进行调用
 * <p>
 * 1.先完成显示菜单,并且可以选择
 * 2.完成零钱通明细
 * 3.完成收益入账
 * 4.消费
 * 5.退出
 */
public class SmallChangeSysOOP {
    //属性
    boolean loop = true;
    Scanner scanner = new Scanner(System.in);
    String key = "";
    String details = "========零钱通明细========";
    //        3.完成收益入账,完成功能驱动增加新的变化和代码
    //定义新变量
    double money = 0;
    double balance = 0;
    Date date = null;//date 是java.util.Date 类型,表示日期
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");//可以用于日期格式化

    //4.消费
    //消费说明
    String note = "";//消费说明


    //先完成显示菜单,并且可以选择
    public void mainMenu() {
        do {
            //定义相关的变量
            System.out.println("\n========(OOP)零钱通菜单========");
            System.out.println("\t\t\t1.零钱通明细\t\t\t");
            System.out.println("\t\t\t2.收益入账\t\t\t");
            System.out.println("\t\t\t3.消费\t\t\t");
            System.out.println("\t\t\t4.退  出\t\t\t");

            System.out.print("请选择(1~4):");
            key = scanner.next();
            //使用switch分支结构
            switch (key) {
                case "1":
                    this.detail();
                    break;
                case "2":
                  this.income();
                  break;
                case "3":
                   this.pay();
                    break;
                case "4":
                    this.exit();
                    break;
                default:
                    System.out.println("ERROR,你的输入有误,请重新选择!");
            }
        } while (loop);
        System.out.println("你退出了零钱通项目,感谢使用！！！");
    }

    //完成零钱通明细
    public void detail() {
        System.out.println(details);
    }

    //完成收益入账
    public void income() {
        System.out.print("收益入账金额:");
        money = scanner.nextDouble();
        /*money值的范围应该校验-->一会儿完善
         * 思路:
         * 找出不正确金额的条件,然后给出提示,就直接return 提倡
         * */
        if (money <= 0) {
            System.out.println("收益入账金额范围需要大于0元~");
            return;//退出方法,不再执行后面的方法
        }

        balance += money;
        //拼接收益账户信息到details
        date = new Date();//获取当前的日期 Sun Mar 03 14:22:45 CST 2024
        details += "\n收益入账\t+" + money + "\t" + sdf.format(date) + "\t" + balance;
    }

    //消费
    public void pay(){
        System.out.print("消费金额:");
        money = scanner.nextDouble();
        //消费金额的范围校验-->一会儿完善
        //消费金额不正确的情况
        //过关斩将的校验方式
        if (money <= 0 || money > balance) {
            System.out.println("你的消费金额不正确~  应该在 0~" + balance);
            return;
        }
        System.out.print("消费说明:");
        note = scanner.next();
        balance -= money;
        //拼接消费信息到details
        date = new Date();
        details += "\n" + note + "\t-" + money + "\t" + sdf.format(date) + "\t" + balance;
    }

    //退出
    public void exit(){
        System.out.println("========退  出========");
        /*用户输入4退出时,给出提示"你确定要退出吗?y/n",
         * 必须输入正确的y/n,否则循环输入指令,直到输入y或者n
         * 思路分析:
         * (1)定义一个变量choice接收用户的按键输入
         * (2)使用while+break组合循环判断输入的内容
         * (3)退出while后再判断输入的y/n,再决定是否退出
         * (4)一段代码完成一个小功能,尽量不要混在一起
         * */
        String choice = "";
        while (true) {
            System.out.println("您确定要退出吗?y/n");
            choice = scanner.next();
            //第一种
            if ("y".equals(choice) || "n".equals(choice)) {
                break;
            }
            System.out.println("你的输入有误,退出系统失败~");
        }
//                   第一种 当用户退出while时,进行判断
        if (choice.equals("y")) {
            loop = false;
        }
    }
}
